#!/usr/bin/env python3
import sys
from colorama import Back, Fore, Style

bases = "hdboa";

# gera vetor de bytes
def de_binario(entrada):
	meus_bytes=[];
	for byte in entrada.split(' '):
			meus_bytes.append(int(byte, base=2));
	return meus_bytes;

def de_hex(entrada):
	meus_bytes=[];
	for byte in entrada.split(' '):
			meus_bytes.append(int(byte, base=16));
	return meus_bytes;

def de_octal(entrada):
	meus_bytes=[];
	for byte in entrada.split(' '):
			meus_bytes.append(int(byte, base=8));
	return meus_bytes;

def de_decimal(entrada):
	meus_bytes=[];
	for byte in entrada.split(' '):
			meus_bytes.append(int(byte));
	return meus_bytes;

def de_ascii(entrada):
	meus_bytes=[];
	for byte in entrada:
			meus_bytes.append(ord(byte));
	return meus_bytes;

# do vetor de bytes...
def para_hex(entrada):
	saida="";
	for byte in entrada:
		saida+=str( hex(byte)[2:]+" " );
	return saida;

def para_decimal(entrada):
	saida="";
	for byte in entrada:
		saida+=(str(byte)+" ");
	return saida;

def para_binario(entrada):
	saida="";
	for byte in entrada:
		byte = str( bin(byte)[2:] );
		for x in range(8-len(byte)):
			byte="0"+byte;
		saida+=str( byte+" " );

	return saida;

def para_octal(entrada):
	saida="";
	for byte in entrada:
		saida+=str( oct(byte)[2:]+" " );
	return saida;

def para_ascii(entrada):
	saida="";
	for byte in entrada:
		saida+=chr( byte );
	return saida;

def uso():
	print("Uso: "+sys.argv[0]+" <operação> [string]");
	print(Style.BRIGHT+Fore.GREEN+"bases:"+Style.RESET_ALL+" [h]exadecimal, [d]ecimal, [b]inário, [o]ctal e tabela [a]scii");
	print(Style.BRIGHT+Fore.GREEN+"operação:"+Style.RESET_ALL);
	print("\t-[de][para]");
	print("ex.:\t-hd: hexadecimal -> decimal");

if __name__ == '__main__':
	if( len(sys.argv)!=3 or sys.argv[1][0]!='-' or len(sys.argv[1])!=3 or
		sys.argv[1][1] not in bases or sys.argv[1][2] not in bases):
		uso();
		exit();

	entrada=sys.argv[2];
	meus_bytes=[];

	if(sys.argv[1][1]=='h'):
		meus_bytes=de_hex(entrada);
	if(sys.argv[1][1]=='d'):
		meus_bytes=de_decimal(entrada);
	if(sys.argv[1][1]=='b'):
		meus_bytes=de_binario(entrada);
	if(sys.argv[1][1]=='o'):
		meus_bytes=de_octal(entrada);
	if(sys.argv[1][1]=='a'):
		meus_bytes=de_ascii(entrada);

	if(sys.argv[1][2]=='h'):
		print( para_hex(meus_bytes) );
	if(sys.argv[1][2]=='d'):
		print( para_decimal(meus_bytes) );
	if(sys.argv[1][2]=='b'):
		print( para_binario(meus_bytes) );
	if(sys.argv[1][2]=='o'):
		print( para_octal(meus_bytes) );
	if(sys.argv[1][2]=='a'):
		print( para_ascii(meus_bytes) );
